SQLAlchemy তে relationship() এবং backref() দুটি অত্যন্ত গুরুত্বপূর্ণ ফিচার, যা ডেটাবেস টেবিলগুলোর মধ্যে সম্পর্ক (relationships) তৈরি করতে ব্যবহৃত হয়। এগুলি Object Relational Mapping (ORM) এর মূল অংশ, যা ডেটাবেসের মধ্যে টেবিলের সম্পর্ককে Python অবজেক্টের মধ্যে রূপান্তরিত করে। এই দুটি ফিচারের মাধ্যমে আপনি ডেটাবেস টেবিলগুলির মধ্যে বিভিন্ন ধরনের সম্পর্ক (One-to-One, One-to-Many, Many-to-Many) তৈরি এবং পরিচালনা করতে পারেন।
relationship() ফাংশন
relationship() হল SQLAlchemy এর ORM ফিচার যা দুইটি টেবিলের মধ্যে সম্পর্ক তৈরি করতে ব্যবহৃত হয়। এটি একটি প্রপার্টি হিসেবে কাজ করে, যা সম্পর্কিত টেবিলের রেকর্ডগুলি অবজেক্ট হিসেবে লোড করতে সক্ষম করে। এটি শুধুমাত্র টেবিল সম্পর্ক মডেল করার জন্য ব্যবহৃত হয় এবং এর মাধ্যমে আপনি One-to-Many, Many-to-One, এবং Many-to-Many সম্পর্ক তৈরি করতে পারেন।
relationship() এর বৈশিষ্ট্য
- এটি একটি two-way সম্পর্ক তৈরি করতে সহায়তা করে (যেমন, একটি টেবিল থেকে সম্পর্কিত টেবিলের রেকর্ড অ্যাক্সেস করা এবং উল্টোটি)।
- এটি সম্পর্কিত রেকর্ডগুলি লোড করার জন্য lazy loading বা eager loading এর মতো কৌশল ব্যবহার করতে সহায়তা করে।
relationship()ব্যবহার করে আপনি সম্পর্কিত টেবিলের মধ্যে রেফারেন্স তৈরি করতে পারেন, যেমন একজন পিতা-মাতার সাথে সন্তানের সম্পর্ক বা এক ক্লাসের সাথে অন্যান্য ক্লাসের সম্পর্ক।
উদাহরণ:
from sqlalchemy import Column, Integer, String, ForeignKey
from sqlalchemy.orm import relationship
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
# Parent টেবিল
class Parent(Base):
__tablename__ = 'parents'
id = Column(Integer, primary_key=True)
name = Column(String)
# One-to-many relationship with Child
children = relationship("Child", backref="parent")
# Child টেবিল
class Child(Base):
__tablename__ = 'children'
id = Column(Integer, primary_key=True)
name = Column(String)
parent_id = Column(Integer, ForeignKey('parents.id'))
এখানে, Parent টেবিলের সাথে Child টেবিলের One-to-Many সম্পর্ক তৈরি করা হয়েছে। relationship("Child", backref="parent") এর মাধ্যমে এই সম্পর্ক প্রতিষ্ঠিত হয়েছে। এখানে backref ব্যবহার করা হয়েছে, যা উল্টো দিকেও সম্পর্ক তৈরি করে।
backref() ফাংশন
backref() হল SQLAlchemy তে একটি পদ্ধতি, যা দুটি সম্পর্কিত টেবিলের মধ্যে উল্টো দিকের সম্পর্ক তৈরি করতে ব্যবহৃত হয়। এটি relationship() এর সাথে ব্যবহার করা হয়, এবং এটি ডেটাবেসের উল্টো দিক থেকে সম্পর্কের জন্য একটি virtual attribute তৈরি করে দেয়। এর মাধ্যমে, আপনি সম্পর্কিত টেবিলের মধ্যে সম্পর্কের উল্টো দিক থেকে সহজে অ্যাক্সেস পেতে পারেন।
backref() এর বৈশিষ্ট্য
backref()আপনাকে একটি সম্পর্কের উল্টো দিক থেকে সম্পর্কিত টেবিলের অবজেক্ট অ্যাক্সেস করতে সহায়তা করে।- এটি এক ধরনের bidirectional relationship তৈরি করে, যেখানে দুটি টেবিলের সম্পর্ক একে অপরের সাথে যুক্ত থাকে।
উদাহরণ:
from sqlalchemy import Column, Integer, String, ForeignKey
from sqlalchemy.orm import relationship
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
# Parent টেবিল
class Parent(Base):
__tablename__ = 'parents'
id = Column(Integer, primary_key=True)
name = Column(String)
# One-to-many relationship with Child, backref 'parent' creates reverse relationship
children = relationship("Child", backref="parent")
# Child টেবিল
class Child(Base):
__tablename__ = 'children'
id = Column(Integer, primary_key=True)
name = Column(String)
parent_id = Column(Integer, ForeignKey('parents.id'))
এখানে, backref="parent" ব্যবহার করা হয়েছে, যা Child অবজেক্টের মধ্যে parent নামক একটি অতিরিক্ত অ্যাট্রিবিউট তৈরি করে। এর মাধ্যমে, আপনি Child অবজেক্টের মধ্যে সংশ্লিষ্ট Parent অবজেক্ট অ্যাক্সেস করতে পারবেন।
backref ব্যবহার উদাহরণ:
# নতুন Parent এবং Child তৈরি করা
parent1 = Parent(name="John")
child1 = Child(name="Alice", parent=parent1)
# Child থেকে Parent অ্যাক্সেস করা
print(child1.parent.name) # "John"
# Parent থেকে Child অ্যাক্সেস করা
print(parent1.children[0].name) # "Alice"
এখানে child1.parent.name ব্যবহার করে Child অবজেক্টের মাধ্যমে সম্পর্কিত Parent অবজেক্ট অ্যাক্সেস করা হয়েছে এবং parent1.children[0].name এর মাধ্যমে Parent অবজেক্টের মাধ্যমে সম্পর্কিত Child অবজেক্ট অ্যাক্সেস করা হয়েছে।
One-to-Many এবং Many-to-One সম্পর্ক
One-to-Many সম্পর্কের মধ্যে একটি পিতা-মাতা টেবিল একাধিক সন্তান টেবিলের রেকর্ডের সাথে সম্পর্কিত। আর Many-to-One সম্পর্কের মধ্যে একাধিক সন্তান টেবিলের রেকর্ড একটি পিতা-মাতা টেবিলের সাথে সম্পর্কিত।
উদাহরণ (One-to-Many):
# One-to-many relationship
parent = Parent(name="Alice")
child1 = Child(name="John", parent=parent)
child2 = Child(name="Jane", parent=parent)
session.add(parent)
session.commit()
# Parent থেকে Child রেকর্ড পেতে
parent_children = parent.children # পিতা-মাতার সাথে সম্পর্কিত সমস্ত সন্তান
এখানে, Parent অবজেক্টের children প্রপার্টি ব্যবহার করে সম্পর্কিত multiple Child অবজেক্ট অ্যাক্সেস করা হয়েছে।
Many-to-Many সম্পর্ক
Many-to-Many সম্পর্কের মধ্যে দুটি টেবিলের মধ্যে অনেকগুলো রেকর্ড একে অপরের সাথে সম্পর্কিত থাকে। SQLAlchemy তে এই সম্পর্ক তৈরি করতে একটি association table ব্যবহার করা হয়, যা দুইটি টেবিলের মধ্যে সম্পর্ক ধারণ করে।
উদাহরণ (Many-to-Many):
from sqlalchemy import Table, ForeignKey
from sqlalchemy.orm import relationship
# Association table between Student and Course
student_course_association = Table('student_course', Base.metadata,
Column('student_id', Integer, ForeignKey('students.id')),
Column('course_id', Integer, ForeignKey('courses.id'))
)
class Student(Base):
__tablename__ = 'students'
id = Column(Integer, primary_key=True)
name = Column(String)
courses = relationship("Course", secondary=student_course_association, backref="students")
class Course(Base):
__tablename__ = 'courses'
id = Column(Integer, primary_key=True)
name = Column(String)
এখানে, Student এবং Course টেবিলের মধ্যে Many-to-Many সম্পর্ক তৈরি করা হয়েছে। student_course_association টেবিলটি দুটি টেবিলের মধ্যে সম্পর্ক সংরক্ষণ করে।
সারাংশ
relationship()এবংbackref()SQLAlchemy ORM তে টেবিলের মধ্যে সম্পর্ক তৈরি এবং পরিচালনার জন্য ব্যবহৃত হয়।relationship()একটি সম্পর্ক তৈরি করতে সাহায্য করে, যেমন One-to-Many, Many-to-One, এবং Many-to-Many।backref()দুটি সম্পর্কিত টেবিলের মধ্যে উল্টো দিকের সম্পর্ক তৈরি করে, যাতে আপনি এক টেবিল থেকে সম্পর্কিত অন্য টেবিলের রেকর্ড অ্যাক্সেস করতে পারেন।- এই দুটি ফিচার একে অপরের সাথে কাজ করে ডেটাবেস সম্পর্ককে অবজেক্ট-ওরিয়েন্টেডভাবে সহজ করে তোলে।
Read more